<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /**
     * 展平嵌套对象或数组
     * 此函数的目的是将嵌套的对象或数组转换为一个扁平的对象，其中的键使用点符号（.）和中括号（[]）来表示嵌套结构
     * 这对于将复杂的数据结构转换为更容易处理或理解的格式非常有用
     * @param {Object|Array} obj - 要展平的对象或数组
     * @returns {Object} - 展平后的对象
     */
    function objectFlatten(obj){
        // 存储展平后的键值对
        let result = {}

        /**
         * 递归展平对象或数组
         * 此内部函数负责实际的展平工作，通过递归调用自身来处理嵌套的对象或数组
         * @param {*} currentValue - 当前正在处理的值
         * @param {string} currentPrefix - 当前值的前缀，用于构建展平后的键
         */
        function flatten(currentValue,currentPrefix){
            // 如果当前值为null，直接将其存储到结果对象中
            if(currentValue === null){
                result[currentPrefix] = currentValue
                return
            }
            // 如果当前值不是对象，直接将其存储到结果对象中
            if(typeof currentValue !== 'object'){
                result[currentPrefix] = currentValue
                return
            }
            // 如果当前值是数组，遍历数组并递归调用flatten函数
            if(Array.isArray(currentValue)){
                for(let i = 0;i < currentValue.length;i++){
                    const newValue = currentValue[i]
                    const newPrefix = currentPrefix ? `${currentPrefix}[${i}]` : `[${i}]`
                    flatten(newValue,newPrefix)
                }
            } else {
                // 如果当前值是对象，遍历对象的键并递归调用flatten函数
                const keys = Object.keys(currentValue)
                keys.forEach(item => {
                    const newValue = currentValue[item]
                    const newPrefix = currentPrefix ? `${currentPrefix}.${item}` : `${item}`
                    flatten(newValue,newPrefix)
                })
            }
        }
        // 调用内部函数开始展平过程
        flatten(obj,'')
        // 返回展平后的对象
        return result
    }

    const obj = {
        a: {
            b: 1,
            c: 2,
            d: {
                e: 5
            }
        },
        b: [1, 3, {a: 2, b: 3}],
        c: 3
    }
    console.log(objectFlatten(obj))
</script>
</html>
